<?php

namespace app\command;

use app\common\service\OrderStatus;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\Db;
use think\Log;

class OrderComplete extends Command
{
    protected function configure()
    {
        // 命令名称（每天凌晨1点执行）
        $this->setName('order:complete')->setDescription('每天凌晨1点检查派送中订单，改为已完成');
    }

    protected function execute(Input $input, Output $output)
    {
        // 1. 查询派送中的订单（状态：派送中；假设派送中）
        $orders = Db::name('orders')
            ->where('status', OrderStatus::DELIVERY_IN_PROGRESS)
            ->select();

        if (empty($orders)) {
            $output->writeln("当前无派送中订单");
            Log::info("订单完成 task：无派送中订单");
            return;
        }

        // 2. 批量修改状态为“已完成”（已完成）
        $successCount = 0;
        $failLogs = [];
        foreach ($orders as $order) {
            Db::startTrans();
            try {
                Db::name('orders')
                    ->where('id', $order['id'])
                    ->update([
                        'status' => OrderStatus::COMPLETED,
                        'delivery_time' => time() // 完成时间
                    ]);

                // 可选：触发后续逻辑（如通知用户、更新销量等）
                // event('orderComplete', $order);

                $successCount++;
                Db::commit();
            } catch (\Exception $e) {
                Db::rollback();
                $failLogs[] = "订单ID:{$order['id']} 处理失败: " . $e->getMessage();
                Log::error("订单完成 task失败：" . json_encode($failLogs));
            }
        }

        $output->writeln("处理完成：成功完成{$successCount}个订单");
        if (!empty($failLogs)) {
            $output->writeln("失败订单：" . implode(',', $failLogs));
        }
    }
}
